package com.lyb269.jvm.classLoader;

import org.junit.Test;

/**
 * 类加载体系
 */
public class ClassLoaderSystemTest {

    @Test
    public void test(){
        System.out.println(Thread.currentThread().getContextClassLoader());
        //输出: sun.misc.Launcher$AppClassLoader@18b4aac2 使用的系统加载器  AppClassLoader

        System.out.println(ClassLoaderSystemTest.class.getClassLoader());
        //输出: sun.misc.Launcher$AppClassLoader@18b4aac2 使用的系统加载器  AppClassLoader

        System.out.println(ClassLoader.getSystemClassLoader());
        //输出: sun.misc.Launcher$AppClassLoader@18b4aac2 使用的系统加载器  AppClassLoader

        System.out.println(ClassLoader.getSystemClassLoader().getParent());
        //输出: sun.misc.Launcher$ExtClassLoader@4a574795 AppClassLoader加载器的父类为ExtClassLoader

        System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent());
        //输出: null AppClassLoader加载器的父类为ExtClassLoader,ExtClassLoader的父加载器为BootstrapLoader,BootstrapLoader是native底层实现的,所以打印为null

        System.out.println(System.class.getClassLoader());
        //输出: null System类是系统提供的,在rt.jar里面,由BootstrapLoader加载,BootstrapLoader是native底层实现的,所以打印为null


        //双亲委派机制,自下往上查下
        // BootstrapLoader
        //      |
        //      |
        // ExtClassLoader
        //      |
        //      |
        // AppClassLoader
        // 加载顺序:根据双亲委派机制,自下AppClassLoader开始查找,没有从ExtClassLoader尝试查找,
        // 还是没有从BootstrapLoader查找,如果仍然没有自顶向下开始尝试
    }
}
